﻿// -------------------------------------------------------------------------
//    @FileName         :    NFStorageBagOpMgr.h
//    @Author           :    Gao.Yi
//    @Date             :    2025-10-21
//    @Email			:    445267987@qq.com
//    @Module           :    NFStorageBagOpMgr
//    @Desc             :
//
// -------------------------------------------------------------------------

// --- 文件总结 ---------------------------------------------------------------
// `NFStorageBagOpMgr` 是仓库背包操作管理器类：
// - 继承自 NFBagPageOpMgrInterface，专门用于管理仓库背包操作
// - 与 NFOnlineAcc（在线账号）紧密集成，处理账号级别的仓库背包
// - 不支持金钱操作（仓库只存储物品，不存储金钱）
// - 提供提交、同步、事件触发等功能
// - 与 NFBagPageOpMgr 类似，但用于不同的服务器（OnlineServer vs LogicServer）
// ---------------------------------------------------------------------------

#pragma once

#include "NFLogicCommon/BagPage/NFBagBaseOp.h"
#include "NFLogicCommon/BagPage/NFBagPageOpMgrInterface.h"

class NFOnlineAcc;
class NFOnlineRole;

/**
 * @brief 仓库背包操作管理器（账号版本）
 * 继承自 NFBagPageOpMgrInterface，专门用于管理账号级别的仓库背包操作
 */
class NFStorageBagOpMgr : public NFBagPageOpMgrInterface
{
public:
    /**
     * @brief 构造函数
     * @param pAcc 账号指针
     * @param iOpReason 操作原因
     * @param bNeedCommit 是否需要提交（默认true）
     */
    NFStorageBagOpMgr(NFOnlineAcc* pAcc, int iOpReason, bool bNeedCommit = true);
    
    /**
     * @brief 析构函数
     */
    ~NFStorageBagOpMgr() override;
public:
    /**
     * @brief 提交所有操作，将操作结果应用到真实容器（只允许执行一次）
     * @param bSyncToClient 是否将变更同步给客户端
     * @return 0成功，非0失败
     */
    int Commit(bool bSyncToClient = true) override;
    
    /**
     * @brief 获取指定背包页签
     * @param iBagType 背包页签类型
     * @return 背包页签指针（可能为nullptr）
     */
    NFBagPage* GetBagPage(int iBagType) override;
    
    /**
     * @brief 添加常用的仓库容器
     * @return 0成功，非0失败
     */
    int AddAllBagPage() override;
    
    /**
     * @brief 获取金钱数量（仓库不支持金钱，返回0）
     * @param moneyType 金钱类型
     * @return 0（仓库不存储金钱）
     */
    int64_t GetMoneyNumber(int moneyType) override;
    
    /**
     * @brief 设置金钱数量（仓库不支持金钱操作）
     * @param moneyType 金钱类型
     * @param num 金钱数量
     * @return ERR_CODE_INVALID_REQ_PARAM（不支持）
     */
    int SetMoneyNumber(int moneyType, int64_t num) override;
    
    /**
     * @brief 增加金钱（仓库不支持金钱操作）
     * @param enMoneyType 金钱类型
     * @param llMoney 想要增加的金钱数
     * @param pAddedNum 输出实际增加数量
     * @return ERR_CODE_INVALID_REQ_PARAM（不支持）
     */
    int IncMoney(int enMoneyType, int llMoney, int* pAddedNum = nullptr) override;
    
    /**
     * @brief 减少金钱（仓库不支持金钱操作）
     * @param enMoneyType 金钱类型
     * @param llMoney 想要减少的金钱数
     * @param piDelNum 输出实际减少数量
     * @return ERR_CODE_INVALID_REQ_PARAM（不支持）
     */
    int DecMoney(int enMoneyType, int llMoney, int* piDelNum = nullptr) override;
    
    /**
     * @brief 背包满时添加物品的特殊处理（仓库不需要特殊处理）
     * @param stWillAddItemData 待添加物品数据
     * @param iLeftAddNum 剩余要添加的数量
     * @param iAddNum 输出实际添加数量
     * @return 0成功，非0失败
     */
    int AddItemWhenBagFull(const WillAddItemData& stWillAddItemData, int iLeftAddNum, int& iAddNum) override;
    
    /**
     * @brief 背包满时添加物品的特殊处理（物品对象版本）
     * @param pItem 物品对象
     * @param iLeftAddNum 剩余要添加的数量
     * @param iAddNum 输出实际添加数量
     * @return 0成功，非0失败
     */
    int AddItemWhenBagFull(const NFGridItem* pItem, int iLeftAddNum, int& iAddNum) override;
private:
    /**
     * @brief 提交所有操作到账号（内部实现）
     * @return 0成功，非0失败
     */
    int CommitToPlayer();
    
    /**
     * @brief 将变更同步给客户端
     * @return 0成功，非0失败
     */
    int SyncToPlayer();

    /**
     * @brief 预检查提交
     * @return 0成功，非0失败
     */
    int PreCheckCommit();

    /**
     * @brief 将仓库背包变更同步给客户端
     * @return 0成功，非0失败
     */
    int SyncPackageToPlayer();
private:
    /** @brief 账号指针 */
    NFOnlineAcc* m_pAcc;
};